/**
 * ***************************************************************************** Copyright (c) 2000,
 * 2009 IBM Corporation and others. All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0 which accompanies this
 * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
 *
 * <p>Contributors: IBM Corporation - initial API and implementation
 * *****************************************************************************
 */
package org.eclipse.core.resources;

import org.eclipse.core.runtime.CoreException;

/**
 * Interface for project nature runtime classes. It can configure a project with the project nature,
 * or de-configure it. When a project is configured with a project nature, this is recorded in the
 * list of project natures on the project. Individual project natures may expose a more specific
 * runtime type, with additional API for manipulating the project in a nature-specific way.
 *
 * <p>Clients may implement this interface.
 *
 * @see IProject#getNature(String)
 * @see IProject#hasNature(String)
 * @see IProjectDescription#getNatureIds()
 * @see IProjectDescription#hasNature(String)
 * @see IProjectDescription#setNatureIds(String[])
 */
public interface IProjectNature {
  /**
   * Configures this nature for its project. This is called by the workspace when natures are added
   * to the project using <code>IProject.setDescription</code> and should not be called directly by
   * clients. The nature extension id is added to the list of natures before this method is called,
   * and need not be added here.
   *
   * <p>Exceptions thrown by this method will be propagated back to the caller of <code>
   * IProject.setDescription</code>, but the nature will remain in the project description.
   *
   * @exception CoreException if this method fails.
   */
  public void configure() throws CoreException;

  /**
   * De-configures this nature for its project. This is called by the workspace when natures are
   * removed from the project using <code>IProject.setDescription</code> and should not be called
   * directly by clients. The nature extension id is removed from the list of natures before this
   * method is called, and need not be removed here.
   *
   * <p>Exceptions thrown by this method will be propagated back to the caller of <code>
   * IProject.setDescription</code>, but the nature will still be removed from the project
   * description. *
   *
   * @exception CoreException if this method fails.
   */
  public void deconfigure() throws CoreException;

  /**
   * Returns the project to which this project nature applies.
   *
   * @return the project handle
   */
  public IProject getProject();

  /**
   * Sets the project to which this nature applies. Used when instantiating this project nature
   * runtime. This is called by <code>IProject.create()</code> or <code>IProject.setDescription()
   * </code> and should not be called directly by clients.
   *
   * @param project the project to which this nature applies
   */
  public void setProject(IProject project);
}
